home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / fax / src / util / Ptr.h < prev    next >
C/C++ Source or Header  |  1994-08-01  |  3KB  |  78 lines

  1. /*    $Header: /usr/people/sam/fax/util/RCS/Ptr.h,v 1.5 1994/02/28 14:23:53 sam Rel $ */
  2. /*
  3.  * Copyright (c) 1990, 1991, 1992, 1993, 1994 Sam Leffler
  4.  * Copyright (c) 1991, 1992, 1993, 1994 Silicon Graphics, Inc.
  5.  *
  6.  * Permission to use, copy, modify, distribute, and sell this software and 
  7.  * its documentation for any purpose is hereby granted without fee, provided
  8.  * that (i) the above copyright notices and this permission notice appear in
  9.  * all copies of the software and related documentation, and (ii) the names of
  10.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  11.  * publicity relating to the software without the specific, prior written
  12.  * permission of Sam Leffler and Silicon Graphics.
  13.  * 
  14.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  15.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  16.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  17.  * 
  18.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  19.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  20.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  21.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  22.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  23.  * OF THIS SOFTWARE.
  24.  */
  25. #ifndef _Ptr_
  26. #define    _Ptr_
  27.  
  28. #include "Obj.h"
  29.  
  30. /******************************
  31.   What the declaration of a fxPtr class looks like to the user:
  32.  
  33. class fxPtr<T> : public fxPtr<> {
  34.     fxPtr<T>();
  35.     fxPtr<T>(<T>* obj);
  36.     fxPtr<T>(const fxPtr<T>& other);
  37.     ~fxPtr<T>();
  38.  
  39.     fxPtr<T>& operator=(const fxPtr<T>& other);
  40.     fxPtr<T>& operator=(<T>* obj);
  41.     operator <T>*();
  42.     <T>* operator->();
  43. };
  44. ******************************/
  45.  
  46. #define fxDECLARE_Ptr(TYPE)                        \
  47. class fxCAT(TYPE,Ptr) {/*XXX*/                        \
  48. protected:                                \
  49.     void destroy() { if (p) p->dec(); }                    \
  50.     TYPE* p;                                \
  51. public:                                     \
  52.     fxCAT(TYPE,Ptr)() { p = 0; }                    \
  53.     fxCAT(TYPE,Ptr)(TYPE *tp) { p = tp ? (tp->inc(),tp) : 0; }        \
  54.     fxCAT(TYPE,Ptr)(const fxCAT(TYPE,Ptr)& other)            \
  55.     { p = other.p ? (other.p->inc(),other.p) : 0; }            \
  56.     ~fxCAT(TYPE,Ptr)() { destroy(); }                    \
  57.     fxCAT(TYPE,Ptr)& operator=(const fxCAT(TYPE,Ptr)& other) {        \
  58.     if (p != other.p) {                        \
  59.         destroy(); p = other.p ? (other.p->inc(),other.p) : 0;    \
  60.     }                                \
  61.     return *this;                            \
  62.     }                                    \
  63.     fxCAT(TYPE,Ptr)& operator=(TYPE* tp) {                \
  64.     if (p != tp) {                            \
  65.         destroy(); p = tp ? (tp->inc(),tp) : 0;            \
  66.     }                                \
  67.     return *this;                            \
  68.     }                                    \
  69.     int compare(const fxCAT(TYPE,Ptr) *other) const            \
  70.     { return int((char *)p - (char *)other->p); }            \
  71.     operator TYPE*() { return p; }                    \
  72.     operator const TYPE*() const { return p; }                \
  73.     TYPE* operator ->() { return p; }                    \
  74.     const TYPE* operator ->() const { return p; }            \
  75. }                                    \
  76. __enddef__
  77. #endif /* _Ptr_ */
  78.